sqlalchemy 中 create_all 建表疑问

2015-02-08 11:57:19 +08:00
 hfli

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的类创建成功。

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

7087 次点击
所在节点    Python
9 条回复
hfli
2015-02-08 12:13:04 +08:00
抱歉,主题中用markdown编辑 不支持马克飞象的markdown语法?
kamil
2015-02-08 12:17:47 +08:00
因为你这个文件里没有定义model
hfli
2015-02-08 12:20:30 +08:00
@kamil 感谢回复。

我定义了model,并且在initialize_db函数中已经import model了呀
kamil
2015-02-08 12:22:41 +08:00
Sorry,我看漏了,你创建model用的declarative_base,和这里的不是一个吧,你随便贴一个model出来看下
hfli
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
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
2015-02-09 09:28:55 +08:00
猜测是你运行这个文件时,sqlalchemy还没有加载models目录下的数据表信息,你也没有显示import呀。当在整个项目的入口运行时,sqlalchemy会把默认位置的models全加载进来。仅仅猜测,几年不用sqlalchemy,我都忘了。
hfli
2015-02-09 10:10:46 +08:00
@kamil
@azhai

感谢两位的回复,我晚上回去试试。
hfli
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就不会创建数据表。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/169225

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX