代码之家  ›  专栏  ›  技术社区  ›  Mittenchops

python包初始化数据库

  •  0
  • Mittenchops  · 技术社区  · 7 年前

    我使用以下说明创建包:

    https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html

    mypackage/bin
    mypackage/bin/initialize_sqlite.sh
    mypackage/mypackage/__init__.py
    mypackage/mypackage/a_bunch_of_python.py
    mypackage/mypackage/tests/__init__.py
    mypackage/mypackage/tests/test_setup.py
    mypackage/mypackage/maketables.sql
    mypackage/setup.py
    

    在哪里? initialize_sqlite.sh

    #!/usr/bin/env bash
    
    sqlite3 my.db < ../mypackage/maketables.sql # creates a Users table
    

    setup.py是

    from setuptools import setup
    
    setup(name='mypackage,
          packages=['mypackage'],
          scripts=['bin/initialize_sqlite.sh'],
          install_requires=[
              'pysqlite3'
          ],
          test_suite='nose.collector',
          tests_require=['nose'],      
          zip_safe=False)
    

    from pathlib import Path
    import mypackage
    
    def get_project_root():
        """Returns project root folder.
        """
        return Path(mypackage.__file__).parent.absolute()
    
    ROOT = get_project_root()
    DBFILE = str(ROOT.joinpath('my.db'))
    

    我的mypackage/mypackage/tests/test_setup.py是:

    from unittest import TestCase
    
    import mypackage
    from mypackage import utils
    from pysqlite3 import dbapi2 as sqlite3 
    
    class TestSqlAccess(TestCase):
        def test_sql_access(self):
            conn = sqlite3.connect(utils.DBFILE)
            db = conn.cursor()
            s = db.execute("PRAGMA database_list").fetchall()
            self.assertNotEqual(s, [])
            s2 = db.execute("SELECT 1 from Users LIMIT 1").fetchall()
    

    ./bin/initialize_sqlite.sh
    

    它很好地创造了

    mypackage/my.db
    

    如我所料。

    pip install ./mypackage
    

    当我看到:

    ll /home/user/anaconda3/envs/myenv/lib/python3.6/site-packages/mypackage/my.db
    

    它是空的,大小为0。

    ERROR: test_sql_access (mypackage.tests.test_setup.TestSqlAccess)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/user/.../tests/test_setup.py", line 14, in test_sql_access
        s2 = db.execute("SELECT 1 from Users LIMIT 1").fetchall()
    pysqlite3.dbapi2.OperationalError: no such table: Users
    

    我的安装箱或路径有什么问题?是不是找不到maketables.sql而没有悄悄地告诉我(所以它有效地找到了sqlite3 my.db<空文件)?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Pavel M.    7 年前

    你检查过文件模式和所有者吗?

    ls -la