通过声明性映射创建架构:Base.metadata.create_all(engine)不起作用

时间:2019-05-29 13:36:21

标签: python mysql sqlalchemy

这是sqlalchemy的一个荒谬问题,似乎很简单!首先,这是我的用于连接到数据库的配置文件:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('mysql://root:@localhost:3306/digi')

然后,我试图创建一个名为'sale-history'的表:

from config import *
from sqlalchemy import *

class Sale(Base):
    __tablename__ = 'sale-history'
    order_id = column(Integer, primary_key= True)
    customer_id = column(Integer)
    item_id = column(Integer)       #froeign key with product list
    cartFinalize_dateTime = column(DATETIME)
    amount_ordrered = column(Integer)
    city_name = column(String(191))
    quantity_ordered = column(Integer)

    def __repr__(self):
        return "<Sale(city_name='%s')>" % (self.city_name)

Sale.__table__
Base.metadata.create_all(engine)

现在,我想知道的是

Sale.__table__

Base.metadata.create_all(engine)

我的代码未知。更准确地说,这些不是pycharm编辑器显示的建议选项。调试代码不会引发任何错误(返回0)。我应该怎么做创建表? 非常感谢您的考虑!

1 个答案:

答案 0 :(得分:0)

代码使用column定义表中的列,但应该使用Column(注意大写的“ C”)。

一些提示/评论

  • 如果您避免使用from module import *惯用语,Pycharm可能会提供更好的支持。如果要输入很长的模块名称,则可以使用别名,例如import sqlalchemy as sa
  • 您可以通过将echo=True传递给create_engine来查看引擎生成的SQL
  • 带连字符的表名必须用反引号引起来,才有效。 Sqlalchemy会自动执行此操作,但其他应用程序可能不会。改用下划线可能会更方便。

最终代码可能如下所示:

config

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine('mysql://root:@localhost:3306/test', echo=True)

型号

import sqlachemy as sa
import config


class Sale(Base): 
    __tablename__ = 'sale-history'
    order_id = sa.Column(sa.Integer, primary_key=True)
    customer_id = sa.Column(sa.Integer)   
    item_id = sa.Column(sa.Integer)       # foreign key with product list
    cartFinalize_dateTime = sa.Column(sa.DATETIME)
    amount_ordrered = sa.Column(sa.Integer)
    city_name = sa.Column(sa.String(191))
    quantity_ordered = sa.Column(sa.Integer)

    def __repr__(self):
        return "<Sale(city_name='%s')>" % (self.city_name)


Base.metadata.create_all(config.engine)