Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用SQLAlchemy仅创建一个表?_Python_Mysql_Python 3.x_Sqlalchemy - Fatal编程技术网

Python 如何使用SQLAlchemy仅创建一个表?

Python 如何使用SQLAlchemy仅创建一个表?,python,mysql,python-3.x,sqlalchemy,Python,Mysql,Python 3.x,Sqlalchemy,我无法使用SQLAlchemy创建单个表 我可以通过调用Base.metadata.create\u all(engine)来创建它,但是随着表的数量增加,这个调用需要很长时间 我动态创建表类,然后填充它们 from sqlalchemy import create_engine, Column, Integer, Sequence, String, Date, Float, BIGINT from sqlalchemy.ext.declarative import declarative_ba

我无法使用SQLAlchemy创建单个表

我可以通过调用
Base.metadata.create\u all(engine)
来创建它,但是随着表的数量增加,这个调用需要很长时间

我动态创建表类,然后填充它们

from sqlalchemy import create_engine, Column, Integer, Sequence, String, Date, Float, BIGINT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class HistoricDay():

    id = Column(Integer, Sequence('id_seq'), primary_key=True)
    #  Date, Open, High, Low, Close, Volume, Adj Close
    date = Column(Date)
    open = Column(Float)
    high = Column(Float)
    low = Column(Float)
    close = Column(Float)
    volume = Column(BIGINT)
    adjClose = Column(Float)

    def __init__(self, date, open, high, low, close, volume, adjClose):
        self.date = date
        self.open = open
        self.high = high
        self.low = low
        self.close = close
        self.volume = volume
        self.adjClose = adjClose

def build_daily_history_table_repr(self):
        return "<"+self.__tablename__+"('{}','{}','{}','{}','{}','{}','{}','{}')>".format(self.id, self.date, self.open, self.high, self.low, self.close, self.volume, self.adjClose)

def build_daily_history_table(ticket):
    classname = ticket+"_HistoricDay"
    globals()[classname] = type(classname, (HistoricDay,Base), {'__tablename__' : ticket+"_daily_history"})
    setattr(globals()[classname], '__repr__', build_daily_history_table_repr)

# Initialize the database :: Connection & Metadata retrieval
engine = create_engine('mysql+cymysql://root@localhost/gwc?charset=utf8&use_unicode=0', pool_recycle=3600) # ,echo = True

# SqlAlchemy :: Session setup
Session = sessionmaker(bind=engine)

# Create all tables that do not already exist
Base.metadata.create_all(engine)

# SqlAlchemy :: Starts a session
session = Session()

ticketList = getTicketList()

for ticket in ticketList:
    build_daily_history_table(ticket)
    class_name = ticket+"_HistoricDay"

    meta_create_all_timer = time.time()
    # Create all tables that do not already exist
    # globals()[class_name]('2005-07-24',0,0,0,0,0,0).create(engine)  #doesn't work
    #(globals()[class_name]).__table__.create(engine) #doesn't work
    # session.commit() #doesn't work

    #Base.metadata.create_all(engine) # works but gets very slow
    print("  meta_create_all_timer {}s".format(time.time()-meta_create_all_timer))

    data = getData(ticket)

    for m_date, m_open, m_close, m_high, m_low, m_volume, m_adjClose in data:
        entry = globals()[class_name](m_date, m_open, m_high, m_low, m_close, m_volume, m_adjClose)
        session.add(entry)

    session.commit()
但是,我无法理解如何使用
declarative_base()
执行与
Table
相同的操作

对于从
声明性_base()
继承的类,如何做到这一点

上面,声明性的_base()callable从 所有映射类都应该继承的。当类定义为 完成后,将生成一个新表和映射器()

生成的表格和映射器可通过
\uuuuu table\uuuu
映射器属性

(来自)

因此:

def build_daily_history_table(ticket):
    classname = ticket + "_HistoricDay"
    ticket = type(classname, (Base, HistoricDay), {'__tablename__' : ticket+"_daily_history"})
    ticket.__repr__ =  build_daily_history_table_repr
    return ticket

build_daily_history_table("test").__table__.create(bind = engine)
2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE test_daily_history (
    id INTEGER NOT NULL, 
    date DATE, 
    open FLOAT, 
    high FLOAT, 
    low FLOAT, 
    close FLOAT, 
    volume BIGINT, 
    "adjClose" FLOAT, 
    PRIMARY KEY (id)
)


2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine ()
2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine COMMIT
输出:

def build_daily_history_table(ticket):
    classname = ticket + "_HistoricDay"
    ticket = type(classname, (Base, HistoricDay), {'__tablename__' : ticket+"_daily_history"})
    ticket.__repr__ =  build_daily_history_table_repr
    return ticket

build_daily_history_table("test").__table__.create(bind = engine)
2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE test_daily_history (
    id INTEGER NOT NULL, 
    date DATE, 
    open FLOAT, 
    high FLOAT, 
    low FLOAT, 
    close FLOAT, 
    volume BIGINT, 
    "adjClose" FLOAT, 
    PRIMARY KEY (id)
)


2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine ()
2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine COMMIT
这要归功于评论/更正,或者我可能会提出类似于以下内容的建议:

Base.metadata.tables["ticket_daily_history"].create(bind = engine)
建议:

def build_daily_history_table(ticket):
    classname = ticket + "_HistoricDay"
    ticket = type(classname, (Base, HistoricDay), {'__tablename__' : ticket+"_daily_history"})
    ticket.__repr__ =  build_daily_history_table_repr
    return ticket

build_daily_history_table("test").__table__.create(bind = engine)
2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE test_daily_history (
    id INTEGER NOT NULL, 
    date DATE, 
    open FLOAT, 
    high FLOAT, 
    low FLOAT, 
    close FLOAT, 
    volume BIGINT, 
    "adjClose" FLOAT, 
    PRIMARY KEY (id)
)


2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine ()
2013-10-04 22:36:53,263 INFO sqlalchemy.engine.base.Engine COMMIT

build\u daily\u history\u table
中使用的方法可能是最不优雅的方法之一,主要原因是它污染了/弄乱了数据库。要创建特定的表,给
tables
参数以
create\u all()
方法就足够了

Base.metadata.create_all(engine, tables=table_objects)
表_对象等于:

table_objects = [HistoricDay.__table__]

我给你看了一张桌子。您可以根据需要增加表的数量

参考:
用一行创建所有不存在的表。默认情况下,首先检查表是否存在

Base.metadata.create_all(db_engine, Base.metadata.tables.values(),checkfirst=True)
使用
表名称创建一个目标表

Base.metadata.create_all(db_engine, Base.metadata.tables[table_name],checkfirst=True)
它与
声明性\u base
完美配合

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
TABLE_PREFIX = "decision_"


class Stock(Base):
    __tablename__ = '{}stocks'.format(TABLE_PREFIX)

    id = Column(Integer, primary_key=True)
    name = Column(String)

class StagePerformance(Base):
    __tablename__ = '{}stage_performance'.format(TABLE_PREFIX)

    id = Column(Integer, primary_key=True)
    date = Column(DateTime)
    stock = relationship("Stock", back_populates="stage_performances")
    period = Column(Integer )
    open = Column(Float)
    high = Column(Float)
    low = Column(Float)
    close = Column(Float)
    change_ratio = Column(Float)
    turnover = Column(Float)
    volume = Column(Float)

它应该是
HistoricDay(Base)
No,因为HistoricDay没有属性tablename。生成的类继承自Base:globals()[classname]=type(classname,(HistoricDay,Base),{'tablename':ticket+“\u daily\u history”})我尝试过,但
回溯(最近一次调用):m_init()文件“autoPopulate.py”第493行,m_init()文件“autoPopulate.py”,第422行,m_init state=success\u state(ticket)文件“autoPopulate.py”,第306行,在success\u state globals()[class\u name].create(engine)AttributeError:type对象'HMN\u HistoricDay'没有属性'create'
HistoricDay.\uu table\uuuuuuuuuuu.create(engine)
对于cymysql连接器,我必须使用
\uu table\uuuuuuuu.create(engine,checkfirst=True)
据我所见,@javex的评论正是我们大多数人在这里寻找的,因此在问题中再强调一点可能会有用。第二个选项对我有用:Base.metadata.create_all(engine,tables=[Product._table_u])。谢谢