V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hfli
V2EX  ›  Python

sqlalchemy 中 create_all 建表疑问

  •  1
     
  •   hfli · 2015-02-08 11:57:19 +08:00 · 7069 次点击
    这是一个创建于 3376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    sqlalchemy新手,用下面的初始化数据库代码,单独运行后,数据表并没有初始化(要ORM映射的类写在model中)。
    ``` python
    database = "mysql://%s:%s@%s/%s" %(DBUSER,DBPASSWD,DBHOST,DBNAME)
    mysql_engine = sqlalchemy.create_engine(database,echo=True)

    mBase = sqlalchemy.ext.declarative.declarative_base()

    def initialize_db():
    import model
    try:
    mBase.metadata.create_all(mysql_engine)
    except OperationalError, err:
    print("Error %s" % str(err))

    print("Data Base Completed")
    

    初始化数据库

    initialize_db()
    ```


    但如果在主程序(启动webserver的py文件中)中调用initialize_db,数据表就会根据ORM的类创建成功。

    不明白这是为什么,问题出在哪里?

    9 条回复    2015-02-10 11:42:59 +08:00
    hfli
        1
    hfli  
    OP
       2015-02-08 12:13:04 +08:00
    抱歉,主题中用markdown编辑 不支持马克飞象的markdown语法?
    kamil
        2
    kamil  
       2015-02-08 12:17:47 +08:00   ❤️ 1
    因为你这个文件里没有定义model
    hfli
        3
    hfli  
    OP
       2015-02-08 12:20:30 +08:00
    @kamil 感谢回复。

    我定义了model,并且在initialize_db函数中已经import model了呀
    kamil
        4
    kamil  
       2015-02-08 12:22:41 +08:00
    Sorry,我看漏了,你创建model用的declarative_base,和这里的不是一个吧,你随便贴一个model出来看下
    hfli
        5
    hfli  
    OP
       2015-02-08 12:26:45 +08:00
    创建model:
    -----------------------------------------------
    ./model/post.py

    __author__ = 'hfli'

    import time
    import sqlalchemy
    from config import mBase

    class Post(mBase):

    __tablename__ = 'Post'

    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key = True, autoincrement = True)
    title = sqlalchemy.Column(sqlalchemy.String(64))
    content = sqlalchemy.Column(sqlalchemy.Text)
    created_date = sqlalchemy.Column(sqlalchemy.Integer)
    update_date = sqlalchemy.Column(sqlalchemy.Integer)

    def __init__(self, title=title, content=content,
    created_date = None, update_date = None):
    self.title=title
    self.content = content

    if created_date == None:
    created_data = time.time()
    else:
    self.update_date = update_date

    if update_date == None:
    update_date = time.time()
    else:
    self.update_date = update_date
    -----------------------------------------------------------
    上面的config,即在帖子里面贴出来的initialize_db所在的文件。
    kamil
        6
    kamil  
       2015-02-08 12:31:48 +08:00
    database = "mysql://%s:%s@%s/%s" %(DBUSER,DBPASSWD,DBHOST,DBNAME)
    mysql_engine = sqlalchemy.create_engine(database,echo=True)

    def initialize_db():
    import model
    try:
    model.mBase.metadata.create_all(mysql_engine)
    except OperationalError, err:
    print("Error %s" % str(err))
    print("Data Base Completed")

    initialize_db()

    改成这样应该就可以了
    azhai
        7
    azhai  
       2015-02-09 09:28:55 +08:00
    猜测是你运行这个文件时,sqlalchemy还没有加载models目录下的数据表信息,你也没有显示import呀。当在整个项目的入口运行时,sqlalchemy会把默认位置的models全加载进来。仅仅猜测,几年不用sqlalchemy,我都忘了。
    hfli
        8
    hfli  
    OP
       2015-02-09 10:10:46 +08:00
    @kamil
    @azhai

    感谢两位的回复,我晚上回去试试。
    hfli
        9
    hfli  
    OP
       2015-02-10 11:42:59 +08:00
    @azhai 我在initialize_db函数中,已经显式import过了。
    @kamil 在initialize_db函数中的mBase前加model.会显示错误:model没有mBase属性。

    另外,我在initialize_db中如果把import model,改为 from model import *,那么就会创建数据表。而如果是import model就不会创建数据表。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3167 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 15:13 · PVG 23:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.